#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton*button=new QPushButton(this);
    button->setText("按钮");
    button->move(200,200);
    connect(button,&QPushButton::clicked,this,&Widget::handleClicked);
}

//自定义的槽函数-按下按钮后，修改窗口标题
void Widget::handleClicked()
{
    this->setWindowTitle("按钮已按下");
}

//Qt Creator自动生成的槽函数定义
void Widget::on_pushButton_clicked()
{
    this->setWindowTitle("按钮已按下(图形化)");
}

Widget::~Widget()
{
    delete ui;
}

//所谓的槽(solt),就是一个普通的成员函数
/*
 * 所谓的自定义一个槽函数，操作过程和自定义一个普通的成员函数没有任何区别
 * 在以前的Qt版本中，槽函数必须放到public/protected/private slots:中
 * 这个public slots:中的slots是Qt自己扩展的关键字，不属于C++标准的语法
 * Qt里面广泛使用元编程技术，即基于代码生成代码
 * qmake构建Qt项目的时候，就会调用专门的扫描器，扫描代码中特定的关键字(slots这种)
 * 基于关键字自动生成一大堆相关的代码
*/


/*
 * 使用图形化的方式自定义槽函数
 * 1、进入widget.ui图形化界面，拖动一个控件(比如：QPushButton按钮控件)
 * 2、鼠标右击此按钮->转到槽
 * 3、跳出的窗口中就列出了此QPushButton按钮给我们提供的所有的信号，包括QPushButton父类、父类的父类的信号
 * 4、选择信号之后，确定之后，Qt就自动为用户声明和定义了此自定义函数，只需要用户书写此自定义函数要实现的功能即可
*/

/*
 * 在Qt中，用图形化方式创建自定义槽函数时
 * 图形化方式使用的是通过函数名称的方式来自动连接控件-信号-槽函数的，类似于connect()函数
 * void Widget::on_pushButton_clicked()
 *        固定前缀_控件的objectName_信号名称
 * 当函数名符合上述规则之后，Qt就可以自动的把信号和槽给建立上联系了。
 * 图形化方式是通过函数名来自动连接的
 *
 * Qt中图形化方式之所以是自动通过函数名来自动连接的原因：
 * Qt中调用了QMetaObject::connectSlotsByName(Widget)函数
 * Qt中调用QMetaObject::connectSlotsByName(Widget)函数时
 * 就会触发自动连接信号槽的规则
 * 这个QMetaObject::connectSlotsByName(Widget)函数是由qmake和widget.ui文件自动生成的
 * 在ui_widget.h中定义的
 *
 * 如果使用图形化界面创建控件时，使用快速方式来建立信号槽
 * 如果使用代码方式创建控件，还是手动connect()连接控件-信号-槽函数三者之间的关系。
 * 使用代码方式时，不会调用QMetaObject::connectSlotsByName(Widget)函数
*/
